const cron = require('node-cron')
const ExpirationService = require('../services/expirationService')
const logger = require('../utils/logger')

class PointsExpirationJob {
  /**
   * 启动积分过期相关的定时任务
   */
  static start() {
    // 每天凌晨2点执行积分过期清理
    cron.schedule('0 2 * * *', async () => {
      try {
        logger.info('开始执行定时积分过期清理任务')
        const result = await ExpirationService.scheduledExpiredPointsCleanup()
        logger.info(`定时积分过期清理完成: 处理 ${result.processedCount} 条记录，影响 ${result.affectedUsers} 个用户`)
      } catch (error) {
        logger.error('定时积分过期清理任务失败:', error)
      }
    }, {
      scheduled: true,
      timezone: 'Asia/Shanghai'
    })

    // 每天上午9点发送积分过期提醒
    cron.schedule('0 9 * * *', async () => {
      try {
        logger.info('开始执行定时积分过期提醒任务')
        const result = await ExpirationService.scheduledExpirationReminder()
        logger.info(`定时积分过期提醒完成: 发送 ${result.sentCount} 条通知`)
      } catch (error) {
        logger.error('定时积分过期提醒任务失败:', error)
      }
    }, {
      scheduled: true,
      timezone: 'Asia/Shanghai'
    })

    // 每周一上午10点生成积分过期周报
    cron.schedule('0 10 * * 1', async () => {
      try {
        logger.info('开始生成积分过期周报')
        
        const endDate = new Date()
        const startDate = new Date()
        startDate.setDate(startDate.getDate() - 7) // 过去7天
        
        const report = await ExpirationService.getExpirationReport(startDate, endDate)
        
        logger.info(`积分过期周报生成完成: 总计 ${report.summary.totalExpiredPoints} 积分过期，影响 ${report.summary.totalAffectedUsers} 个用户`)
        
        // TODO: 可以将报表发送给管理员或保存到文件
        
      } catch (error) {
        logger.error('生成积分过期周报失败:', error)
      }
    }, {
      scheduled: true,
      timezone: 'Asia/Shanghai'
    })

    logger.info('积分过期定时任务已启动')
    logger.info('- 每天凌晨2点: 积分过期清理')
    logger.info('- 每天上午9点: 积分过期提醒')
    logger.info('- 每周一上午10点: 积分过期周报')
  }

  /**
   * 停止所有定时任务
   */
  static stop() {
    cron.getTasks().forEach((task, name) => {
      task.stop()
      logger.info(`定时任务 ${name} 已停止`)
    })
  }

  /**
   * 手动执行积分过期清理（用于测试）
   */
  static async manualCleanup() {
    try {
      logger.info('手动执行积分过期清理')
      const result = await ExpirationService.scheduledExpiredPointsCleanup()
      logger.info(`手动积分过期清理完成: 处理 ${result.processedCount} 条记录`)
      return result
    } catch (error) {
      logger.error('手动积分过期清理失败:', error)
      throw error
    }
  }

  /**
   * 手动执行积分过期提醒（用于测试）
   */
  static async manualReminder() {
    try {
      logger.info('手动执行积分过期提醒')
      const result = await ExpirationService.scheduledExpirationReminder()
      logger.info(`手动积分过期提醒完成: 发送 ${result.sentCount} 条通知`)
      return result
    } catch (error) {
      logger.error('手动积分过期提醒失败:', error)
      throw error
    }
  }
}

module.exports = PointsExpirationJob